home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / ax3.00 / menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-03  |  48.3 KB  |  1,670 lines

  1. #include "bbs.h"
  2. #include <clib/intuition_protos.h>
  3. int CallMsgFuncs(WORD which,int pass);
  4. int RelNum=0;
  5. void ScanHoldDesc(void);
  6. extern struct myst my_struct;           /* temp */
  7. /******* Fix so user only sees the Bulletins once *******/
  8. int BatchError;
  9. int CommentToSYSOP(void);
  10. int IsFromConf(int Conf,char *c);
  11. int GetFromConf(int Conf,char *c,char *buf);
  12. int IntFromConf(int Conf,char *c);
  13. int ALL;
  14. char NetConf[30];
  15. extern char prototitle[];
  16. void FileStatus(int opt);
  17. extern int NotRelative;
  18. char TEMPMENU_Li[255];
  19. BYTE Didsomething;
  20. int GetInverse(int CN);
  21. int RelConf(int CN);
  22. static int JEZoom(void);
  23. int PagesAllowed;
  24. extern int relogon;
  25. extern int templogon;
  26. static BOOL no_scrn_clr = FALSE;
  27. int Join_Conference(int cn)
  28. {
  29.  char string[200];
  30.  int mystat,TCN,ch;
  31.  long temp;
  32.  if(!cn) {
  33.      if(strlen(MAINMENU_Li)>1) {
  34.          strcat(MAINMENU_Li," -1 ");
  35.          sscanf(MAINMENU_Li,"%s %d",&string,&TCN);
  36. TCN=GetInverse(TCN);
  37.  
  38.          if(TCN<1||TCN>Boards_Are_Active)            goto CNTJoin;
  39.          
  40.          goto JOINit;
  41.      }
  42. CNTJoin:
  43.      sprintf(GSTR1,"%sJoinConf",Sopt->NodeScreen);
  44.      if(!(mystat=ChecktoDisplay(GSTR1,GSTR2,1,0)))
  45.          UnAvailNotice(GSTR2,GSTR1);
  46.  
  47.      AEPutStr("Conference Number: ");  GetConfName(Conference_Name,Conference_Location,CN-1);
  48.  
  49.      mystat=LineInput("",string,8,KEYBOARD_TIMEOUT);
  50.      if(mystat<0)  return(NO_CARRIER);
  51.      if(strlen(string)==0) { AEPutStr("\r\n");
  52.       return(SUCCESS); }
  53.  
  54.      sscanf(string,"%d",&TCN);
  55.      TCN=GetInverse(TCN);
  56.      if(TCN<1||TCN>Boards_Are_Active) {  GetConfName(Conference_Name,Conference_Location,CN-1);
  57.  
  58.          AEPutStr("\r\nNot a valid conference number\r\n\r\n");
  59.          return(SUCCESS);
  60.      }
  61.  } else  TCN=cn;
  62.  
  63. JOINit:
  64.  if(!IsValidConf(TCN-1)||TCN>Boards_Are_Active) {
  65.      TCN=CN;
  66.      if(!cn)
  67.          AEPutStr("\r\nYou do not have access to requested conference\r\n\r\n");
  68.      return(SUCCESS);
  69.  }
  70.  GetConfName(Conference_Name,Conference_Location,TCN-1);
  71.  if(Conference_Location[0]=='\0')
  72.  {
  73.    CallersLog("\t****Conference Location unknown in MENU routines****\n");
  74.    sprintf(GSTR1,"\t**** For Conference %d\n",TCN);
  75.    CallersLog(GSTR1);
  76.  }
  77.  RelNum=RelConf(TCN);
  78.  if(!cn) {
  79.      sprintf(string,"\t%s (%d) Conference Joined\n",Conference_Name,RelNum);
  80.      CallersLog(string);
  81.  }
  82.  
  83.  if(!cn)
  84.      sprintf(string,"\r\nJoining Conference%s\r\n",Conference_Name);
  85.  else
  86.      sprintf(string,"Scanning Conference%-23.23s  ",Conference_Name);
  87.  
  88.  
  89.  AEPutStr(string);
  90.  
  91.    if(!GetFromConf(TCN-1,"CONF_NETID",NetConf)) strcpy(NetConf,"");
  92.  if(!cn)
  93.  {
  94.   if(strlen(NetConf)>3)
  95.  {
  96.    if(NetConf[0]=='H' || NetConf[0]=='h')
  97.  sprintf(string,"NetNode: %s , Host to NetConf: %s\r\n",Sopt->BBSConfig,&NetConf[3]);
  98.    else
  99.  sprintf(string,"NetNode: %s , Sub to NetConf: %s\r\n",Sopt->BBSConfig,&NetConf[3]);
  100.    AEPutStr(string);
  101.  }
  102.  }
  103.  if(!cn) AEPutStr("\r\n");
  104.  CN=TCN;
  105.  if(!cn) User.ConfRJoin=CN;
  106.  
  107.  LoadMsgPointers(CN);
  108.  
  109.  mystat=GetMailStatFile();
  110.  if(mystat==FAILURE)     return(FAILURE);
  111.  if(Last_Msg_Read_Conf<MailStat.LowestNotDel) Last_Msg_Read_Conf=MailStat.LowestNotDel;
  112.  if(Last_New_Read_Conf<MailStat.LowestNotDel) Last_New_Read_Conf=MailStat.LowestNotDel;
  113.  FreeDownloads=1;
  114.  
  115.  strcpy(GSTR1,Conference_Location);
  116.  if(MaxDirs=IntFromConf(TCN-1,"NDIRS")) {
  117.      if(IsFromConf(TCN-1,"FREEDOWNLOADS")) {
  118.          FreeDownloads=0;
  119.      }   else
  120.          FreeDownloads=1;
  121.     
  122.  }
  123.  
  124.  if(!GetFromConf(TCN-1,"SCREENS",Screen_Location))
  125.        strcpy(Screen_Location,Conference_Location);
  126.  if(!cn)
  127.  {    
  128.      strcpy(GSTR1,Screen_Location);
  129.      strcat(GSTR1,"BULL");
  130.      if(ch=ChecktoDisplay(GSTR1,GSTR2,1,1)) {
  131.          ch=DoPause();
  132.          if(ch<0)  return(ch);
  133.          AEPutStr("\r\n");
  134.  
  135.      }
  136.      if(BatchError<0) return(BatchError);
  137.  }
  138.  if(Last_Msg_Read_Conf>MailStat.HighMsgNum)
  139.      Last_Msg_Read_Conf=0;
  140.  
  141.  if(Last_New_Read_Conf>MailStat.HighMsgNum)
  142.      Last_New_Read_Conf=0;
  143.  
  144.  if(!cn) {
  145.    if(MailStat.LowestKey>1)
  146.    {
  147.      sprintf(string,"Messages range from %ld %ld )\r\n",
  148.                  MailStat.LowestKey,MailStat.HighMsgNum-1);
  149.    }else
  150.  sprintf(string,"\r\nTotal messages           : %ld\r\n",MailStat.HighMsgNum-1);      
  151.    AEPutStr(string);
  152.    
  153.  temp=Last_New_Read_Conf-1;
  154.  if(temp<0)  temp=1;
  155.  
  156.  sprintf(string,"\r\nLast message auto scanned: %ld\r\n",temp);
  157.  AEPutStr(string);
  158.  
  159.      sprintf(string,"Last message read        : %ld\r\n\r\n",Last_Msg_Read_Conf);
  160.  AEPutStr(string);
  161.  
  162.  
  163.  }
  164.  mystat=CallMsgFuncs(3,cn);
  165.  SaveMsgPointers(CN);
  166. return(mystat);
  167. }
  168.  
  169. static void DisMenu(void)
  170. {
  171.  int stat;
  172.  
  173.  if(no_scrn_clr == FALSE)     /* dont do screen clear code */
  174.     if(User_keys.Userflags & USER_SCRNCLR)  AEPutStr("\f");   // (RTS) Screen CLEAR
  175.  sprintf(GSTR1,"%sMenu",Screen_Location);
  176.  
  177.  if(!(stat=ChecktoDisplay(GSTR1,GSTR2,1,0)))
  178.      UnAvailNotice(GSTR2,GSTR1);
  179.  no_scrn_clr = FALSE;     /* dont do screen clear code */
  180. }
  181.  
  182.  
  183. static void UserStatus(void)
  184. {
  185.  long TimeVar;
  186.  char string[100],c[100], temp[100];
  187.  
  188.  TimeVar=Time_Last_On;
  189.  sprintf(string,"%s",ctime(&TimeVar));
  190.  Convert_CTime_To_Date(string,c,temp);
  191.  
  192.  /** Display Users Stat's **/
  193.  
  194.  AEPutStr("\r\n");
  195.  
  196.  if(NotRelative)
  197.  {
  198.  sprintf(string,"Area Name  : %s\r\n",User.Conference_Access);
  199.    AEPutStr(string);
  200.  }
  201.  sprintf(string,"Caller Num.: %u\r\n",System_Calls);
  202.  AEPutStr(string);
  203.  sprintf(string,"Lst Date On: %s\r\n",c);
  204.  AEPutStr(string);
  205.  sprintf(string,"Security Lv: %d\r\n",User.Sec_Status);
  206.  AEPutStr(string);
  207.  
  208.  sprintf(string,"# Times On : %u\r\n",User.Times_Called);
  209.  AEPutStr(string);
  210.  
  211. //(RTS) Thu Apr 30 18:18:13 1992
  212.  sprintf(string,"Online Baud: %ld\r\n",Online_Baud);
  213.  AEPutStr(string);
  214. // (RTS) Fri Mar 27 13:41:27 1992
  215.  if(User_keys.UPcps > 6000)
  216.      strcpy(string,"Rate CPS UP: 0\r\n");
  217.  else
  218.      sprintf(string,"Rate CPS UP: %d\r\n",User_keys.UPcps);
  219.   AEPutStr(string);
  220.  
  221.  if(User_keys.DNcps > 6000)
  222.     strcpy(string,"Rate CPS DN: 0\r\n");
  223.  else
  224.     sprintf(string,"Rate CPS DN: %d\r\n",User_keys.DNcps);
  225.  AEPutStr(string);
  226.  
  227.  /*(RTS)** User FLags ****/
  228.  if(User_keys.Userflags & USER_SCRNCLR)
  229.     strcpy(string,"Screen  Clr: YES\r\n");
  230.  else
  231.     strcpy(string,"Screen  Clr: NO\r\n");
  232.  
  233.  AEPutStr(string);
  234.     sprintf(string,"Protocol   : %s\r\n",prototitle);
  235.  AEPutStr(string);
  236.  if(PagesAllowed!=-1)
  237.  {
  238.     sprintf(string,"Sysop Pages Remaining: %d\r\n",PagesAllowed);
  239.     AEPutStr(string);
  240.  }
  241.  AEPutStr("\r\n");
  242.  
  243.  FileStatus(1);
  244. }
  245. void FileStatus(int opt)
  246. {
  247.  int valid=0;
  248.  int j=0,i,s;char string[200];
  249.  int k,t=0;
  250.  if(!opt) s=Boards_Are_Active;
  251.  else s=CN; 
  252.  if(GET_BIT(ACS_CONFERENCE_ACCOUNTING)) t=1;
  253.  AEPutStr("\r\n");
  254.  sprintf(string,"              Uploads            Downloads\r\n");
  255.  AEPutStr(string);
  256.  sprintf(string,"     Conf  Files    Bytes     Files    Bytes     Bytes Avail  Ratio\r\n");
  257.  AEPutStr(string);
  258.  AEPutStr("     ----  -------  --------- -------  --------- -----------  -----\r\n");
  259.  SaveMsgPointers(CN);
  260.  for(i=0;i<s;i++)
  261.  {
  262.    if(IsValidConf(i)) { j++; valid=TRUE; } else valid=FALSE;
  263.    if(!opt || i==CN-1)
  264.    {
  265.       if(valid)
  266.    {
  267.       if(!t) k=i+1; else k=j;
  268.       LoadMsgPointers(i+1);
  269.   if(User.Sec_Library)
  270.  sprintf(string,"     %4d> %dm%7d  %9ld %7d  %9ld   %9ld   %d:%dm1\r\n",
  271.          k, i==CN-1?3:6,User.Uploads,User.Bytes_Upload,User.Downloads,User.Bytes_Download,User.Daily_Bytes_Limit-User.Daily_Bytes_Dld,User.Sec_Library,i==CN-1?3:6);
  272.  else
  273. sprintf(string,"     %4d> %dm%7d  %9ld %7d  %9ld   %9ld  DSBLD\r\n",
  274.          k,i==CN-1?3:6,User.Uploads,User.Bytes_Upload,User.Downloads,User.Bytes_Download,User.Daily_Bytes_Limit-User.Daily_Bytes_Dld);
  275.  
  276.  AEPutStr(string);
  277.     }
  278.   }
  279.  }
  280.  AEPutStr("\r\n");
  281.  LoadMsgPointers(CN);
  282.  
  283. }
  284.  
  285. void user_INFO(struct myst *ms);
  286. void cps_show(struct myst *ms);
  287.  
  288. int IntFromFile(char *s,char *temp)
  289. {
  290.  int tempval;
  291.  FILE *fp;
  292.  
  293.  temp[0]='\0';
  294.  
  295.  if(fp=fopen(s,"r")) {
  296.      fgets(temp,50,fp);
  297.      fclose(fp);
  298.      if(temp[0]!='\0') {
  299.          sscanf(temp,"%d",&tempval);
  300.          return(tempval);
  301.      }
  302.  }
  303.  return(0);
  304. }
  305.  
  306.  
  307.  
  308. void Clear_Online_Status(void)
  309. {
  310.  Time_holder=0L;
  311. }
  312.  
  313. static int CCom(void)
  314. {
  315.  int i,i2,stat;
  316.  char str[81],DISPLAY_time[30],string[200],date[20],buff[255];
  317.  
  318.  Time_system=time(NULL);
  319.  sprintf(string,"%s",ctime(&Time_system));
  320.  Convert_CTime_To_Date(string,date,DISPLAY_time);
  321.  sprintf(str,"\tOperator Paged at (%s)\n",DISPLAY_time);
  322.  CallersLog(str);
  323.  
  324.  ConPutStr("\r\nF1 Toggles chat\r\n");
  325.  
  326.  /* show our page sign to user */
  327.  sprintf(buff,"%s\r\nPaging %s (CTRL-C to Abort). .",ctime(&Time_system),Cmds->SysopName);
  328.  AEPutStr(buff);
  329.  for(i=0; i<20; i++) {
  330.      DisplayBeep(NULL);
  331.      AEPutStr(" .");
  332.      for(i2=1; i2<50; i2++) {
  333.          Delay(1L);
  334.          if(Whence_The_Logon>=REMOTE_LOGON)  {
  335.              stat=CheckCarrier();
  336.              if(stat==FALSE)             return(NO_CARRIER);
  337.          }
  338.          if(CheckInput()) {
  339.              stat=ReadChar(1L);
  340.              if(CHATF==1) {
  341.                  AEPutStr("\r\n\r\n");
  342.                  return(SUCCESS);
  343.              }
  344.              if(stat==3) {
  345.                  AEPutStr("Aborted!\r\n\r\n");
  346.                  return(SUCCESS);
  347.              }
  348.          }
  349.      }
  350.  }
  351.  
  352.  AEPutStr("\r\n\r\nThe Sysop has been paged\r\n");
  353.  AEPutStr("You may continue using the system\r\n");
  354.  AEPutStr("until ");
  355.  AEPutStr(Cmds->SysopName);
  356.  AEPutStr(" answers your request.\r\n\r\n");
  357.  StatMessage(1,1,"                            ");
  358.  sprintf(str,"%s",User.Name);
  359.  StatMessage(1,1,str);
  360.  
  361.  return(SUCCESS);
  362. }
  363.  
  364. int DoPause(void)
  365. {
  366. int ch;
  367. LineCount=0;
  368. Pause();
  369.  do  {
  370.      ch=Check_Online_Status();
  371.      if(ch<0) return(ch);
  372.      ch=ReadChar(KEYBOARD_TIMEOUT);
  373.      if(ch<0)  return(ch);
  374.  } while(ch!=13&&ch!=32);
  375.  AEPutStr("\r\n");
  376.  return(SUCCESS);
  377.  
  378. }
  379.  
  380.  
  381. void IntToFile(char *s,int num)
  382. {
  383. FILE *f;
  384.  
  385.  if(f=fopen(s,"w")) {
  386.      fprintf(f,"%d\n",num);
  387.      fclose(f);
  388.  }
  389. }
  390.  
  391.  
  392. int FirstChar(char *s)
  393. {
  394. int loop;
  395.  
  396.  for(loop=0; loop<strlen(s); loop++) {
  397.      if(s[loop]!=' ')
  398.          return(loop);
  399.  }
  400.  return(-1);
  401. }
  402.  
  403. int FirstCharValue(char *s)
  404. {
  405.  int stat;
  406.  
  407.  stat=FirstChar(s);
  408.  if(stat<0)      return(stat);
  409.  
  410.  return((int)s[stat]);
  411. }
  412.  
  413.  
  414. /* This file did not UnLock(FLock) on every level */
  415. static int PartUpload_OK(int option)
  416. {
  417.  struct FileInfoBlock *Fib = NL;
  418.  BPTR FLock;
  419.  int status,ch;
  420.  int rts_stat = SUCCESS;    /* Tue Jan 28 10:37:46 1992 */
  421.  char path[100],str[100],ray2[100];
  422.  int cnt = 0;
  423.  char *s;
  424.  
  425.  strcpy(path,Conference_Location);
  426.  strcat(path,"PartUpload/");
  427.  if(MaxDirs==0)  return(SUCCESS);
  428.  
  429.  
  430.  if(Whence_The_Logon==LOCAL_LOGON) return(SUCCESS);
  431.  
  432.  if(!(FLock = Lock(path,ACCESS_READ)))   {
  433.      sprintf(str,"Tell %s the bbs can't access the %s dir\r\n",Cmds->SysopName,path);
  434.      AEPutStr(str);
  435.      return(SUCCESS); // success = 0
  436.  }
  437.  
  438.                                                       //(RTS) was chip
  439.  if((Fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) == NULL) {
  440.      UnLock(FLock);             //(RTS)
  441.      MyError(0);
  442.      return(0);
  443.  }
  444.  
  445.  if(!(Examine(FLock,Fib))) {
  446.      UnLock(FLock);
  447.      FreeDosObject(DOS_FIB,Fib);
  448.      return(0);
  449.  }
  450.  
  451.  if(Fib->fib_DirEntryType > 0) {   /* make sure we locked a directory */
  452.      while (ExNext(FLock,Fib)) {     /* my change.. prior to this we had a blank file name */
  453.              if(strlen(Fib->fib_FileName) == 0) {   /* check for filename > 0 length */
  454.                  goto OUTOH;
  455.              }
  456.  
  457.              cnt = 0;
  458.              s = Fib->fib_FileName;
  459.              while(*s && cnt < 30) {     /* check for valid file name */
  460.                  if(*s == ' ') {     /* check for spaces at beginning of filename */
  461.                      goto OUTOH;
  462.                  }
  463.                  if(*s == '/') {
  464.                      goto OUTOH;
  465.                  }
  466.                  if(!(isascii((int) *s))) {
  467.                      goto OUTOH;
  468.                  }
  469.                  cnt++;
  470.                  s++;
  471.              }
  472.  
  473. /** END ERROR CKING */
  474.          strcpy(str,Fib->fib_FileName);
  475.          strcpy(ray2,str);
  476.          status=GetUN(str);       /* remove the @(num at end of file. Return user number */
  477.          if(status==User.Slot_Number) {
  478.              AEPutStr("There are some incompleted uploads of yours\r\n");
  479.              if(!option) AEPutStr("Would you like to leave anyway (Y/N)? ");
  480.  
  481.              FOREVER {
  482.                  ch=Check_Online_Status();
  483.                  if(ch<0) {
  484.                      rts_stat = ch;   goto OUTOH;
  485.                  }
  486.                  if(!option)  {
  487.                      ch=ReadChar(KEYBOARD_TIMEOUT);
  488.                      if(ch==TIMEOUT) {
  489.                          rts_stat = NO_CARRIER;   goto OUTOH;/* Tue Jan 28 10:33:54 1992 RTS */
  490.                      }
  491.                      if(Whence_The_Logon>=REMOTE_LOGON) {
  492.                          status=CheckCarrier();
  493.                          if(status==FALSE) {
  494.                              rts_stat = NO_CARRIER;   goto OUTOH;
  495.                          }
  496.                      }
  497.                  } else ch = 'N';
  498.  
  499.                  if(ch=='N' || ch=='n') {
  500.                      if(!option)AEPutStr("No!   View them (Y/N)? ");
  501.                      else AEPutStr("View them (Y/N)? ");
  502.                      PurgeLine();
  503.                      FOREVER {
  504.                          ch=Check_Online_Status();
  505.                          if(ch<0) {
  506.                              rts_stat = ch;   goto OUTOH;
  507.                          }
  508.                          ch=ReadChar(KEYBOARD_TIMEOUT);
  509.                          if(ch==TIMEOUT) {
  510.                              rts_stat = NO_CARRIER;   goto OUTOH;
  511.                          }
  512.                          if(ch=='N' || ch=='n') {
  513.                              AEPutStr("No!\r\n");
  514.                              rts_stat = ABORT;   goto OUTOH;
  515.                          }
  516.                          if(ch=='Y' || ch=='y')  break;
  517.                          else  continue;
  518.                      }
  519.                      // AEPutStr("Yes..\r\n");
  520.                      rts_stat = FAILURE;   goto OUTOH;
  521.                  }   /* end if ch == 'n' */
  522.                  if(ch=='Y' || ch=='y')  break;
  523.                  else  continue;
  524.              }               /* end forever */
  525.          }
  526.         //AEPutStr("Yes..\r\n");
  527.         goto OUTOH;
  528.      }  /* end while (ExNext(FLock,Fib)) */
  529.  }     /* end if(Fib->fib_DirEntryType > 0) */
  530. OUTOH:
  531.  if(FLock) UnLock(FLock);
  532.  if(Fib) FreeDosObject(DOS_FIB,Fib);
  533.  return(rts_stat);
  534. }
  535.  
  536. static int DateNewer(char *s1,char *s2)
  537. {
  538.  int mdt,ddt,ydt,month,day,year,tv;
  539.  char cs1[20],cs2[20];
  540.  
  541.  tv=0;
  542.  
  543.  strcpy(cs1,s1);
  544.  strcpy(cs2,s2);
  545.  
  546.  cs1[2]=' '; cs2[2]=' '; cs1[5]=' '; cs2[5]=' ';
  547.  
  548.  sscanf(cs1,"%d %d %d",&mdt,&ddt,&ydt);
  549.  sscanf(cs2,"%d %d %d",&month,&day,&year);
  550.  
  551.  if(ydt>year)    tv = 1;
  552.  else {
  553.      if(ydt==year) {
  554.          if(mdt>month)
  555.              tv = 1;
  556.          else {
  557.              if(mdt==month) {
  558.                  if(ddt>day)     tv = 1;
  559.              }
  560.          }
  561.      }
  562.  }
  563.  return(tv);
  564. }
  565.  
  566. void DisplayNodeCLog(void);
  567.  
  568. static void EditDirFile(void)
  569. {
  570.  long stat,which;
  571.  
  572.  if(MaxDirs==0) {
  573.      AEPutStr("\r\n");
  574.      MyError(5);
  575.      return;
  576.  }
  577.  
  578.  stat=CommandSplit();
  579.  if(stat>1)
  580.      strcpy(GSTR1,Command[1]);
  581.  else
  582.      GSTR1[0]='\0';
  583.  do{
  584.      if(GSTR1[0]=='\0')  {
  585.          sprintf(GSTR1,"\r\nDirectory to Edit[1-%ld]? ",MaxDirs);
  586.          AEPutStr(GSTR1);
  587.          stat=LineInput("",GSTR1,5,KEYBOARD_TIMEOUT);
  588.          if(stat<0||GSTR1[0]=='\0')  {
  589.              AEPutStr("\r\n");
  590.              return;
  591.          }
  592.      }
  593.      sscanf(GSTR1,"%ld",&which);
  594.      GSTR1[0]='\0';
  595.      if(which<1||which>MaxDirs)
  596.          AEPutStr("\r\nNo such directory!\r\n");
  597.  } while(which<1||which>MaxDirs);
  598.  
  599.  sprintf(GSTR1,"%sDir%ld",Conference_Location,which);
  600.  EditEmacs(GSTR1);
  601.  AEPutStr("\r\n");
  602. }
  603.  
  604. static void EditAnyFile(void)
  605. {
  606.  long stat;
  607.  
  608.  stat=CommandSplit();
  609.  if(stat>1)
  610.      strcpy(GSTR1,Command[1]);
  611.  else {
  612.      AEPutStr("\r\nFullPath/Filename to Editor? ");
  613.      stat=LineInput("",GSTR1,250,KEYBOARD_TIMEOUT);
  614.      if(stat<0||GSTR1[0]=='\0') {
  615.          AEPutStr("\r\n");
  616.          return;
  617.      }
  618.  }
  619.   if(FindAssign(GSTR1))
  620.           {
  621.              AEPutStr("\r\nDevice not Mounted.\r\n");
  622.              AEPutStr("\r\n");
  623.              return;
  624.           }
  625.  EditEmacs(GSTR1);
  626.  AEPutStr("\r\n");
  627. }
  628.  
  629. static void AlterFlags(void)
  630. {
  631.  int stat;
  632.  
  633.  AEPutStr("\r\n");
  634.  if(strlen(MAINMENU_Li)>2) {
  635.      stat=FlagFiles(MAINMENU_Li+2);
  636.      if(stat<0)      return;
  637.      while(stat)     stat=FlagFiles(NULL);
  638.  } else {
  639.      do {
  640.          stat=FlagFiles(NULL);
  641.          if(stat<0)          return;
  642.      } while(stat);
  643.  }
  644.  AEPutStr("\r\n");
  645. }
  646.  
  647. int Download_A_File(char *str);
  648.  
  649. static int BeginDLF(void)      /* begin downloading */
  650. {
  651.  int stat;
  652.  char *str;
  653.  
  654.  stat=FAILURE;
  655.  
  656.  if(str=(UBYTE *)AllocMem(3072,MEMF_ANY|MEMF_CLEAR)) {
  657.      stat=Download_A_File(str);
  658.      FreeMem(str,3072);
  659.  } else  MyError(3);
  660.  return(stat);
  661. }
  662.  
  663.  
  664. static int CheckFlagged(void)
  665. {
  666.  int stat;
  667.  
  668.  if(strlen(flaglist))    {
  669.      AEPutStr("You have flagged files still not downloaded.\r\nDo you leave without them? ");
  670.      stat=YesNo(2);
  671.      return(stat);
  672.  }
  673.  return(1);
  674. }
  675.  
  676.  
  677. /*******************************************************MENU ************/
  678. int SearchString(void);
  679. int MyNewFiles(void);
  680. extern int SetEnvStat(int Code);
  681.  
  682.  
  683. void  check_nodes(void);
  684.  
  685. int Menu(void)
  686. {
  687.  int command_accepted, ch, mystat;
  688.  char string[133],c[100],str[100],tc[100];
  689.  long temp;
  690.  int i = 0;
  691.  Clear_Online_Status();
  692.  Time_menu_entry=time(NULL);
  693.  Time_system=Time_menu_entry;
  694.  
  695.  
  696.  sprintf(c,"%s",ctime(&User.Time_Last_On));
  697.  Convert_CTime_To_Date(c,str,string);
  698.  sprintf(c,"%s",ctime(&Time_menu_entry));
  699.  Convert_CTime_To_Date(c,tc,string);
  700.  
  701.  mystat=DateNewer(tc,str);    /* is it a newer date ? */
  702. Time_limit=User.Time_Limit;
  703.  if(mystat) {
  704.      
  705.      if(Cmds->AcLvl[LVL_KEEP_UPLOAD_CREDIT]>1) {
  706.          if(User.Time_Total-Time_limit>0)
  707.              Time_limit+=(User.Time_Total-Time_limit);
  708.      }
  709.      User.Time_Total=Time_limit;
  710.      User.Time_Used=0L;
  711.      User.Daily_Bytes_Dld=0L;
  712.      BytesADL=User.Daily_Bytes_Limit;
  713.  } else {
  714.      Time_limit=User.Time_Total-User.Time_Used;
  715.      BytesADL=User.Daily_Bytes_Limit-User.Daily_Bytes_Dld;
  716.  }
  717.  
  718.  if(Time_limit<=0L)  {       /*-- User Exceeded his time limit for today --*/
  719.      sprintf(GSTR1,"%sLogon24hrs",Sopt->NodeScreen);
  720.      if(!(mystat=ChecktoDisplay(GSTR1,GSTR2,0,0))) {
  721.          UnAvailNotice(GSTR2,GSTR1);
  722.      }
  723.      return(NO_CARRIER); /* goodbye */
  724.  }
  725.  
  726. LogON=1;
  727.  
  728.  
  729.  /*--- Show BBS:Bull.txt ----*/
  730.  ch=0;
  731.  sprintf(GSTR1,"%sBULL",Cmds->BBSLoc);
  732.  if(ChecktoDisplay(GSTR1,GSTR2,1,1)) {
  733.      mystat=DoPause();
  734.      if(mystat<0) { return(mystat); }
  735.  }
  736.  
  737.  if(BatchError<0) return(BatchError);
  738.  
  739.   /* really need to resave account with new baud rate */
  740.  
  741. // User_keys.baud_rate = Online_Baud;
  742.  
  743.  /* show the New user the Rules */
  744.  if(my_struct.newuserfile && (GET_BIT(ACS_UPLOAD)) && (User_keys.Userflags & USER_NEWMSG) ) {
  745.           ch=ChecktoDisplay(my_struct.newuserfile,GSTR2,0,1);
  746.           User_keys.Userflags ^= USER_NEWMSG;    /* reset bit */
  747.  //JOE 23-Jun modified code to pause only if the newuserfile exists
  748.  
  749.  }
  750.  
  751.  
  752.      
  753.      if(ch)
  754.      {
  755.       mystat=DoPause();
  756.       if(mystat<0) return(mystat);
  757.      }
  758.  
  759. //JOE 23-Jun modified
  760.      sprintf(GSTR1,"%sBULL",Sopt->NodeScreen);
  761.      ch=ChecktoDisplay(GSTR1,GSTR2,1,1);
  762.  
  763. //JOE 23-Jun modified code to pause only if the bulletin exists
  764.  
  765.      if(ch)
  766.      {
  767.       mystat=DoPause();
  768.       if(mystat<0) return(mystat);
  769.      }
  770.      ClearMsgPointers();
  771.      MasterLoadPointers(); 
  772.      
  773. GetProtocol();
  774.  
  775.  SetEnvStat(ENV_SCANNING);
  776.  
  777. //-- if(User.Sec_Status > my_struct.access_scan_level) { /* dont scan if user < 11 */
  778.   /*----------------- Search Conferences for mail ------------------*/
  779.      AEPutStr("\r\nScanning conferences for mail...\r\n\r\n");
  780. //(JOE)
  781.      MCIViewSafe=FALSE;
  782.      for(ch=1; ch<Boards_Are_Active+1; ch++)  {
  783.          mystat=Join_Conference(ch);
  784.            
  785.          if(mystat==FAILURE)         break;
  786.          if(mystat==NO_CARRIER||mystat==TIMEOUT) return(mystat);
  787.      }
  788.      MCIViewSafe=TRUE;
  789. //-- }
  790.  
  791.                 if(GET_BIT(ACS_UPLOAD)) {
  792.                     //AEPutStr("\r\n  --Checking for PartUploads\r\n");
  793.                     for(CN=1;CN<Boards_Are_Active+1;CN++)
  794.                     {
  795.                       GetConfName(Conference_Name,Conference_Location,CN-1);
  796.                       strcpy(GSTR1,Conference_Location);
  797.                       if(MaxDirs=IntFromConf(CN-1,"NDIRS"))
  798.                       {
  799.                         if(IsValidConf(CN-1))
  800.                         {
  801.                    
  802.                    command_accepted=PartUpload_OK(1);
  803.                    if(command_accepted==FAILURE)  {
  804.                      strcpy(MAINMENU_Li,"URG");
  805.                      SetEnvStat(ENV_UPLOADING);
  806.                      if(!(GET_BIT(ACS_UPLOAD)))
  807.                          command_accepted=NOTALLOWED;
  808.                        else
  809.                         command_accepted=Upload_a_File(0);
  810.                    }
  811.                           else
  812.                    if(command_accepted==ABORT)
  813.                    {
  814.                       AEPutStr("\r\n");
  815.                     }
  816.                         
  817.                         }
  818.                       }
  819.                 } 
  820.                AEPutStr("\r\n");
  821.                mystat=DoPause();
  822.          if(mystat<0) return(mystat);
  823.           }
  824.  
  825.  CN=User.ConfRJoin;
  826.  if(!IsValidConf(CN-1))  CN=1;
  827.  if(CN==0||CN>Boards_Are_Active)  CN=1;
  828.  GetConfName(Conference_Name,Conference_Location,CN-1);
  829.  LoadMsgPointers(CN);
  830.  FreeDownloads=1;
  831.  strcpy(str,Conference_Location);
  832.  if(MaxDirs=IntFromConf(CN-1,"NDIRS"))  {
  833.      if(IsFromConf(CN-1,"FREEDOWNLOADS"))  {
  834.          FreeDownloads=0;
  835.      } else      FreeDownloads=1;
  836.  }
  837. if(!GetFromConf(CN-1,"CONF_NETID",NetConf)) strcpy(NetConf,"");
  838.  
  839.   if(!GetFromConf(CN-1,"SCREENS",Screen_Location))
  840.      strcpy(Screen_Location,Conference_Location);
  841.  /* Display that conferences Bulletin to the user */
  842.      strcpy(GSTR1,Screen_Location);
  843.      strcat(GSTR1,"BULL");
  844.      if(ch=ChecktoDisplay(GSTR1,GSTR2,1,1))  {
  845.          ch=DoPause();
  846.          if(ch<0)  return(ch);
  847.      }
  848.      if(BatchError<0) return(BatchError);
  849.  
  850.  GetMailStatFile();
  851.  AEPutStr("\r\n");
  852.  
  853.  if(CN==User.ConfRJoin) ScanHoldDesc();
  854.  UserStatus();
  855.  
  856.  sprintf(string,"Conference %d: %s Auto-ReJoined",RelConf(CN),Conference_Name);
  857.  sprintf(c,"\t%s\n",string);
  858.  CallersLog(c);
  859.  AEPutStr(string);
  860.  AEPutStr("\r\n");
  861.   if(strlen(NetConf)>3)
  862.  {
  863.    if(NetConf[0]=='H' || NetConf[0]=='h')
  864.  sprintf(string,"NetNode: %s , Host to NetConf: %s\r\n",Sopt->BBSConfig,&NetConf[3]);
  865.    else
  866.  sprintf(string,"NetNode: %s , Sub to NetConf: %s\r\n",Sopt->BBSConfig,&NetConf[3]);
  867.    AEPutStr(string);
  868.  }
  869. AEPutStr("\r\n\r\n");
  870.  
  871.  if(Last_Msg_Read_Conf>MailStat.HighMsgNum)
  872.      Last_Msg_Read_Conf=0;
  873.  
  874.  if(Last_New_Read_Conf>MailStat.HighMsgNum)
  875.      Last_New_Read_Conf=0;
  876.  if(MailStat.LowestKey>1)
  877.   {
  878.  sprintf(string,"Messages range from %ld %ld )\r\n",
  879.                  MailStat.LowestKey,MailStat.HighMsgNum-1);
  880.   }
  881.   else
  882. sprintf(string,"\r\nTotal messages           : %ld\r\n",MailStat.HighMsgNum-1);      
  883.  
  884.  AEPutStr(string);
  885.  temp=Last_New_Read_Conf-1;
  886.  if(temp<0)  temp=1;
  887.  
  888.  sprintf(string,"\r\nLast message auto scanned: %ld\r\n",temp);
  889.  AEPutStr(string);
  890.  
  891.  sprintf(string,"Last message read        : %ld\r\n\r\n",Last_Msg_Read_Conf);
  892.  AEPutStr(string);
  893.  
  894.  
  895.  DisplaySysopULStats();
  896.  
  897. MMcont:
  898.  SetEnvStat(ENV_IDLE);
  899.  no_scrn_clr = FALSE;    
  900.  RelNum=RelConf(CN);              /* dont do screen clear code */
  901.  
  902.  
  903.  for(;;) {
  904. MAINMENU:
  905.      ChatFlag=0;
  906.       SetEnvStat(ENV_IDLE);             /* 11w */
  907.  
  908.      if(Check_Online_Status()<0) return(NO_CARRIER);
  909.      if(User.Expert!='X'&&MAINMENU_Li[0]!='?') {
  910.          mystat=DoPause();
  911.          if(mystat<0)  return(mystat);
  912.          DisMenu();
  913.      }
  914.  
  915.          sprintf(string,"%s [%d:%s] Menu (%ld mins. left): ",Cmds->BBSName,RelNum,Conference_Name,Time_limit/60L);
  916.          AEPutStr(string);
  917.  
  918.      while(1) {
  919.          StatPrintUser(&User);
  920.          mystat=LineInput("",MAINMENU_Li,200,KEYBOARD_TIMEOUT);
  921.          if(mystat<0)  return(NO_CARRIER);
  922.          if(strlen(MAINMENU_Li)==0) {
  923.              AEPutStr("\r\n");
  924.              break; /* goto MAINMENU; */
  925.          }
  926.  
  927.                if(MAINMENU_Li[0]==' ')
  928.                {
  929.                     AEPutStr("\r\n");
  930.                     break; 
  931.                }
  932.           
  933.          mystat=MenuCommand(MAINMENU_Li);
  934.          if(mystat!=SUCCESS) return(mystat); else break;
  935.         }
  936.  }
  937.  return(SUCCESS);
  938. }
  939. int MenuCommand(char str1[])
  940. {
  941. int input, command_accepted, mystat;
  942.  char string[133]; int ch;
  943.     strcpy(MAINMENU_Li,str1);
  944.       SetEnvStat(ENV_IDLE);             /* 11w */
  945.  
  946.      if(Check_Online_Status()<0) return(NO_CARRIER);
  947.  
  948.          StatPrintUser(&User);
  949.          if(strlen(MAINMENU_Li)==2&&(!strnicmp(MAINMENU_Li,"rz",2)))
  950.         {
  951.              SetEnvStat(ENV_UPLOADING);            /* 11w */
  952.              command_accepted    = Upload_a_File(1);
  953.              if(command_accepted == GOODBYE) {
  954.                  Goodbye();
  955.                  return(STANDARD_LOGOFF);
  956.              }
  957.              if(command_accepted == NO_CARRIER) {
  958.                  return(NO_CARRIER);
  959.              }
  960.              command_accepted=NOTALLOWED;
  961.              return(SUCCESS);
  962.              }
  963.  
  964.          while(1)
  965.          {
  966.           sprintf(string,"%sCommands/conf%dCmd/",Cmds->BBSLoc,CN);
  967.           command_accepted=CustomCommand(string,MAINMENU_Li,0);
  968.           if(command_accepted==1) return(SUCCESS); /* 11w */
  969.           if(command_accepted!=3) break;
  970.          }
  971.  
  972.          while(1)
  973.          {
  974.           sprintf(string,"%sCommands/BBSCmd/",Cmds->BBSLoc);
  975.           command_accepted=CustomCommand(string,MAINMENU_Li,0);
  976.           if(command_accepted==1) return(SUCCESS);
  977.           if(command_accepted!=3) break;
  978.          }
  979.  
  980. FORCENTRY:
  981.          input=FirstCharValue(MAINMENU_Li);
  982.          
  983.          if(Check_Online_Status()<0)  return(NO_CARRIER);
  984.  
  985.          switch(toupper(input)) {
  986.              case '1':
  987.                  SetEnvStat(ENV_SYSOP);                /* 11w */
  988.                  if(!GET_BIT(ACS_ACCOUNT_EDITING)) {
  989.                      command_accepted=NOTALLOWED;
  990.                      break;
  991.                  }
  992.                  CallersLog("\tAccount editing.\n");
  993.                  Edit_Accounts();
  994.                  command_accepted=SUCCESS;
  995.                  break;
  996.              case '2':
  997.                  SetEnvStat(ENV_SYSOP);
  998.                  if(!GET_BIT(ACS_NODE_LIST)) {
  999.                      command_accepted=NOTALLOWED;
  1000.                      break;
  1001.                  }
  1002.                  DisplayNodeCLog();
  1003.                     command_accepted=SUCCESS;
  1004.                  break;
  1005.              case '3':
  1006.                  SetEnvStat(ENV_EMACS);
  1007.                  if(!(GET_BIT(ACS_EDIT_DIRS))) {
  1008.                      command_accepted=NOTALLOWED;
  1009.                      break;
  1010.                  }
  1011.                  EditDirFile();
  1012.                  command_accepted=SUCCESS;
  1013.                  break;
  1014.              case '4':
  1015.                  SetEnvStat(ENV_EMACS);
  1016.                  if(!(GET_BIT(ACS_EDIT_ANY))) {
  1017.                      command_accepted=NOTALLOWED;
  1018.                      break;
  1019.                  }
  1020.                  EditAnyFile();
  1021.                  command_accepted=SUCCESS;
  1022.                  break;
  1023.              case '5':
  1024.                  SetEnvStat(ENV_SYSOP);
  1025.                  if(!(GET_BIT(ACS_SYSOP_COMMANDS))) {
  1026.                      command_accepted=NOTALLOWED;
  1027.                      break;
  1028.                  }
  1029.                  MyDirAnyWhere();
  1030.                  command_accepted=SUCCESS;
  1031.                  break;
  1032.              case 'A':
  1033.                  /* user must have minimum access to use this command */
  1034.                  if(User.Sec_Status <= Cmds->PSAcLvl[0]) {
  1035.                      command_accepted=NOTALLOWED;
  1036.                      break;
  1037.                  }
  1038.                  if(!GET_BIT(ACS_DOWNLOAD)) { command_accepted=NOTALLOWED; break;}
  1039.                  if(MAINMENU_Li[1]>' ') { command_accepted=SUCCESS; break; }
  1040.                  SetEnvStat(ENV_FILES);               /* 11w */
  1041.                  AlterFlags();
  1042.                  command_accepted=SUCCESS;
  1043.                  break;
  1044.              case 'B':
  1045.                  if(!(GET_BIT(ACS_BULLETINS))) {
  1046.                      command_accepted=NOTALLOWED;
  1047.                      break;
  1048.                  }
  1049.                  SetEnvStat(ENV_BULLETINS);              /* 11w */
  1050.                  command_accepted=Bulletins();
  1051.                  break;
  1052.              case 'C':
  1053.                  SetEnvStat(ENV_MAIL);                   /* 11w */
  1054.                  if(!(GET_BIT(ACS_COMMENT_TO_SYSOP))) {
  1055.                      command_accepted=NOTALLOWED;
  1056.                      break;
  1057.                  }
  1058. //(JOE) MCI security added
  1059.                  MCIViewSafe=FALSE;
  1060.                  command_accepted=CommentToSYSOP();
  1061.                  MCIViewSafe=TRUE;
  1062.                  break;
  1063.              case 'D':
  1064.                  if(!(GET_BIT(ACS_DOWNLOAD))) {
  1065.                      command_accepted=NOTALLOWED;
  1066.                      break;
  1067.                  }
  1068.                  SetEnvStat(ENV_DOWNLOADING);            /* 11w */
  1069.                  command_accepted=BeginDLF();
  1070.                  rfinal[0]='\0';
  1071.                  break;
  1072.              case 'E':
  1073.                  SetEnvStat(ENV_MAIL);                  /* 11w */
  1074.                  if(!(GET_BIT(ACS_ENTER_MESSAGE))) {
  1075.                      command_accepted=NOTALLOWED;
  1076.                      break;
  1077.                  }
  1078. //(JOE) MCI added for security
  1079.                  command_accepted=CallMsgFuncs(2,0); //EnterMSG();
  1080.                  break;
  1081.              case 'F':
  1082.                  if(MAINMENU_Li[1]=='s' || MAINMENU_Li[1]=='S')
  1083.                  {
  1084.                    if(!(GET_BIT(ACS_CONFERENCE_ACCOUNTING))) {
  1085.                      command_accepted=NOTALLOWED;
  1086.                      break;
  1087.                    }
  1088.                    FileStatus(0); command_accepted=0;
  1089.                    break;
  1090.                  }
  1091.                  if(!(GET_BIT(ACS_FILE_LISTINGS))) {
  1092.                      command_accepted=NOTALLOWED;
  1093.                      break;
  1094.                  }
  1095.                  SetEnvStat(ENV_FILES);
  1096.                  command_accepted=DisplayFileList();
  1097.                  no_scrn_clr = TRUE;
  1098.                  break;
  1099.              case 'G':
  1100.                  SetEnvStat(ENV_LOGOFF);
  1101.                  AEPutStr("\r\n");
  1102.  
  1103.                  if(GET_BIT(ACS_UPLOAD)) {
  1104.                      command_accepted=PartUpload_OK(0);
  1105.                      if(command_accepted==FAILURE) {  /* NO leave yet file un finished */
  1106.                          strcpy(MAINMENU_Li,"URG");   /* loop again */
  1107.                          goto FORCENTRY;
  1108.                      }
  1109.                      if(command_accepted==ABORT) {
  1110.                          AEPutStr("\r\n");
  1111.                          break; /* goto MAINMENU */
  1112.                      }
  1113.                  }
  1114.                  mystat=CheckFlagged();
  1115.                  if(!mystat) {
  1116.                      AEPutStr("\r\n");
  1117.                      break;
  1118.                  }
  1119.                  Goodbye();
  1120.                  return(STANDARD_LOGOFF);                 /* goodbye */
  1121.                  break;
  1122.              case 'H':
  1123.                  /* no chat unless validated */
  1124.                  command_accepted=HELP();
  1125.                  break;
  1126. case '^': 
  1127.                  sprintf(GSTR1,"%shelp/%s",Cmds->BBSLoc,&MAINMENU_Li[1]);
  1128.                  while(1)
  1129.                  {
  1130.                  if(ch=ChecktoDisplay(GSTR1,GSTR2,0,1)) {
  1131.                      ch=DoPause();
  1132.                     if(ch<0)  return(ch);
  1133.                      AEPutStr("\r\n");
  1134.                     break;
  1135.                   }
  1136.                   else if(MAINMENU_Li[1]!='\0') { MAINMENU_Li[strlen(MAINMENU_Li)-1]='\0';
  1137.                      sprintf(GSTR1,"%shelp/%s",Cmds->BBSLoc,&MAINMENU_Li[1]);
  1138.                       continue;
  1139.                        }
  1140.                   break;
  1141.                  }
  1142.                   command_accepted=SUCCESS;
  1143.                   break;
  1144.              case '>':
  1145.                  sprintf(MAINMENU_Li,"J %d",RelConf(CN)+1);
  1146.              case '<':
  1147.                  if(!(GET_BIT(ACS_JOIN_CONFERENCE)))
  1148.                  {
  1149.                    command_accepted=NOTALLOWED;
  1150.                    break; 
  1151.                  }
  1152.                  SaveMsgPointers(CN);
  1153.                  if(MAINMENU_Li[0]=='<')
  1154.                  {
  1155.                    sprintf(MAINMENU_Li,"J %d",RelConf(CN)-1);
  1156.                  }
  1157.                  
  1158.                  SetEnvStat(ENV_JOIN);
  1159.                  command_accepted=Join_Conference(0);
  1160.                  AEPutStr("\r\n");
  1161.                  break;
  1162.              case 'J':                              /* Join Conference */
  1163.                  /* no chat unless validated */
  1164.                  if(!(GET_BIT(ACS_JOIN_CONFERENCE))) {
  1165.                      command_accepted=NOTALLOWED;
  1166.                      break;
  1167.                  }
  1168.                  SaveMsgPointers(CN);
  1169.                  
  1170.                  SetEnvStat(ENV_JOIN);                 /* 11w */
  1171.                  command_accepted=Join_Conference(0);
  1172.                  AEPutStr("\r\n");
  1173.                  break;
  1174.  
  1175.              case 'M':
  1176.                  command_accepted=SUCCESS;
  1177.                  if(AnsiColor) {
  1178.                      AnsiColor=0;
  1179.                      AEPutStr("\r\nAnsi Color off\r\n\r\n");
  1180.                  } else {
  1181.                      AnsiColor=1;
  1182.                      AEPutStr("\r\nAnsi Color On\r\n\r\n");
  1183.                  }
  1184.                  break;
  1185.              case 'N':
  1186.                  if(!(GET_BIT(ACS_NEW_FILES_SINCE))) {
  1187.                      command_accepted=NOTALLOWED;
  1188.                      break;
  1189.                  }
  1190.                  SetEnvStat(ENV_FILES);               /* 11w */
  1191.                  command_accepted=MyNewFiles();
  1192.                  no_scrn_clr = TRUE;
  1193.                  break;
  1194.              case 'O':
  1195.                  if(PagesAllowed==0)
  1196.                  {
  1197.                       SetEnvStat(ENV_MAIL);                   /* 11w */
  1198.                  if(!(GET_BIT(ACS_COMMENT_TO_SYSOP))) {
  1199.                      command_accepted=NOTALLOWED;
  1200.                      break;
  1201.                  }
  1202.                  MCIViewSafe=FALSE;
  1203.                  command_accepted=CommentToSYSOP();
  1204.                  MCIViewSafe=TRUE;
  1205.                  break;
  1206.                  }
  1207.                  if(PagesAllowed!=-1) PagesAllowed -=1;
  1208.                  /* no chat unless validated */
  1209.                  if(!(GET_BIT(ACS_PAGE_SYSOP))) {
  1210.                      command_accepted=NOTALLOWED;
  1211.                      break;
  1212.                  }
  1213.                  SetEnvStat(ENV_REQ_CHAT);             /* 11w */
  1214.                  PagedFlag=1;
  1215.                  command_accepted=SUCCESS;
  1216.                  if(SySChat==0&& !(GET_BIT(ACS_OVERRIDE_CHAT))) {
  1217.                      sprintf(string,"\r\nSorry, %s, is not around right now\r\n",Cmds->SysopName);
  1218.                      AEPutStr(string);
  1219.                      AEPutStr("You can use 'C' to leave a comment.\r\n\r\n");
  1220.                  } else
  1221.                      command_accepted=CCom();                  /* chat */
  1222.                  
  1223.                  break;
  1224.              case 'Q': if(GET_BIT(ACS_QUIET_NODE)) {Server(SV_QUIETNODE);} command_accepted=0; break;
  1225.              case 'R':
  1226.                  if(MAINMENU_Li[1]=='L' || MAINMENU_Li[1]=='l')
  1227.                  {
  1228.                     if(GET_BIT(ACS_RELOGON))
  1229.                     {
  1230.                  SetEnvStat(ENV_LOGOFF);
  1231.                  AEPutStr("\r\n");
  1232.                  templogon=Whence_The_Logon; if(templogon==SYSOP_LOGON) templogon=LOCAL_LOGON;
  1233.                  relogon=1;
  1234.                  if(GET_BIT(ACS_UPLOAD)) {
  1235.                      command_accepted=PartUpload_OK(0);
  1236.                      if(command_accepted==FAILURE) {  /* NO leave yet file un finished */
  1237.                          strcpy(MAINMENU_Li,"URG");   /* loop again */
  1238.                          goto FORCENTRY;
  1239.                      }
  1240.                      if(command_accepted==ABORT) {
  1241.                          AEPutStr("\r\n");
  1242.                          break; /* goto MAINMENU */
  1243.                      }
  1244.                  }
  1245.                  mystat=CheckFlagged();
  1246.                  if(!mystat) {
  1247.                      AEPutStr("\r\n");
  1248.                      break;
  1249.                  }
  1250.                  Goodbye();
  1251.                  return(STANDARD_LOGOFF);                 /* goodbye */
  1252.                  break;
  1253.                  }
  1254.                }
  1255.                  SetEnvStat(ENV_MAIL);
  1256.                  if(!(GET_BIT(ACS_READ_MSG))) {
  1257.                      command_accepted=NOTALLOWED;
  1258.                      break;
  1259.                  }
  1260.                  GetMailStatFile();
  1261.                  command_accepted=CallMsgFuncs(1,0);
  1262.                  break;
  1263.              case 'S':
  1264.                  SetEnvStat(ENV_STATS);
  1265.                  if(!(GET_BIT(ACS_DISPLAY_USER_STATS))) {
  1266.                      command_accepted=NOTALLOWED;
  1267.                      break;
  1268.                  }
  1269.                  UserStatus();
  1270.                  command_accepted=SUCCESS;
  1271.                  /*AEPutStr("\r\n");
  1272.                  for(i=0;i<80;i++)
  1273.                  {
  1274.                    if(GET_BIT(i)) AEPutStr("X"); else AEPutStr("_");
  1275.                  }
  1276.                  AEPutStr("\r\n");*/
  1277.                  break;
  1278.              case 'T':
  1279.                  AEPutStr("\r\nIt is ");
  1280.                  Time_system=time(NULL);
  1281.                  sprintf(string,"%s\r\n\r",ctime(&Time_system));
  1282.                  AEPutStr(string);
  1283.  
  1284.                  command_accepted=SUCCESS;
  1285.                  break;
  1286.              case 'U': 
  1287.                  /* no uploading unless validated */
  1288.                  if(!(GET_BIT(ACS_UPLOAD))) {
  1289.                      command_accepted=NOTALLOWED;
  1290.                      break;
  1291.                  }
  1292.                  SetEnvStat(ENV_UPLOADING);          /* 11w */
  1293.                  command_accepted=Upload_a_File(0);
  1294.                  if(command_accepted == NO_CARRIER) {
  1295.                      return(NO_CARRIER);
  1296.                  }
  1297.                  break;
  1298.              case 'V':
  1299.                  SetEnvStat(ENV_VIEWING);
  1300.                  if(!(GET_BIT(ACS_VIEW_A_FILE))) {
  1301.                      command_accepted=NOTALLOWED;
  1302.                      break;
  1303.                  }
  1304.                  command_accepted=View_A_File();
  1305.                  break;
  1306.              case 'W':
  1307.                  /* no account editing unless validated */
  1308.  
  1309.                    if(!(GET_BIT(ACS_EDIT_USER_INFO)))
  1310.             {
  1311.             command_accepted=NOTALLOWED;
  1312.             break;
  1313.             }
  1314.  
  1315.         SetEnvStat(ENV_STATS);
  1316.         command_accepted=UserAccountEdit();
  1317.         
  1318.         break;
  1319.  
  1320.     case 'X':
  1321.                  /* no menu disable if not validated */
  1322.                  if(User.Expert=='X') {
  1323.                      AEPutStr("\r\nExpert mode off\r\n\r\n");
  1324.                      User.Expert='N';
  1325.                  } else  {
  1326.                      AEPutStr("\r\nExpert mode on\r\n\r\n");
  1327.                      User.Expert='X';
  1328.                  }
  1329.                  command_accepted=SUCCESS;
  1330.                  break;
  1331.              case 'Z':
  1332.                  /* no message zooming unless validated */
  1333.                  if((MAINMENU_Li[1]=='o'||MAINMENU_Li[1]=='O')) {
  1334.                      if(GET_BIT(ACS_ZOOM_MAIL)) {
  1335.                          command_accepted=JEZoom();  // chgd from Zoom 11w
  1336.                          break;
  1337.                      }
  1338.                      command_accepted=NOTALLOWED;
  1339.                      break;
  1340.                  }
  1341.                  if(!(GET_BIT(ACS_ZIPPY_TEXT_SEARCH))) {
  1342.                      command_accepted=NOTALLOWED;
  1343.                      break;
  1344.                  }
  1345.                  SetEnvStat(ENV_FILES);
  1346.                  command_accepted=SearchString();
  1347.                  break;
  1348.              case '?':
  1349.                  DisMenu();
  1350.                  command_accepted=SUCCESS;
  1351.                  break;
  1352.              case '\000': /* FN-KEY HIT */
  1353.                  command_accepted=SUCCESS;
  1354.                  AEPutStr("\r\n");
  1355.                  break;
  1356.              default:
  1357.                  AEPutStr("\r\nNo such command!!  Use '?' for command list.\r\n\r\n");
  1358.                  command_accepted=FAILURE;
  1359.                  break;
  1360.          }
  1361.          if(command_accepted==TIMEOUT) return(SLEEP_LOGOFF);
  1362.          if(command_accepted==NO_CARRIER) return(NO_CARRIER);
  1363.          if(command_accepted==GOODBYE)   {
  1364.              Goodbye();
  1365.              return(STANDARD_LOGOFF);
  1366.          }
  1367.          if(command_accepted==NOTALLOWED)
  1368.              AEPutStr("\r\nCommand requires higher access.\r\n\r\n");
  1369.          else AEPutStr("\r\n");
  1370.  
  1371.  return(SUCCESS);
  1372. }
  1373.  
  1374. void DisplaySysopULStats(void)
  1375. {
  1376.  int i,num,num2,t;
  1377.  char str[100],str2[100];
  1378.  FILE *fp;
  1379.  
  1380.  t=0;
  1381.  if(!GET_BIT(ACS_ULSTATS)) return;
  1382.  
  1383.  for(i=0; i<Boards_Are_Active; i++)  {
  1384.      num=0;
  1385.      num2=0;
  1386.      sprintf(str,"%sSysopStats/NumULs_%d",Cmds->BBSLoc,i+1);
  1387.      if((fp = fopen(str,"r"))) {
  1388.          fgets(str2,20,fp);
  1389.          fclose(fp);
  1390.          if(User.Slot_Number==1)DeleteFile(str);
  1391.          sscanf(str2,"%d",&num);
  1392.      }
  1393.  
  1394.      strcat(str,"HOLD");
  1395.      if((fp = fopen(str,"r"))) {
  1396.          fgets(str2,20,fp);
  1397.          fclose(fp);
  1398.          if(User.Slot_Number==1)DeleteFile(str);
  1399.          sscanf(str2,"%d",&num2);
  1400.      }
  1401.      if(num!=0||num2!=0) {
  1402.          t=1;
  1403.          GetConfName(str,str2,i);
  1404.          sprintf(str2,"%s has %d new uploads, %d upload, %d hold\r\n",str,(num+num2),num,num2);
  1405.          AEPutStr(str2);
  1406.      }
  1407.  }
  1408.  GetConfName(str,str2,CN-1);
  1409.  if(t)   AEPutStr("\r\n");
  1410. }
  1411.  
  1412.  
  1413. int GetMailStatFile(void)
  1414. {
  1415.  BPTR fd;
  1416.  LONG stat;
  1417.  char string[100];
  1418.  
  1419.  strcpy(string,MsgBase_Location);
  1420.  strcat(string,"MailStats");
  1421.  fd=Open(string,MODE_OLDFILE);
  1422.  
  1423.  if(fd==NULL) {     /* if The mailstat file doesnt exist creat one */
  1424.      fd=Open(string,MODE_NEWFILE);
  1425.      if(fd==NULL) {
  1426.          MyError(2); // MyError(2);
  1427.          return(FAILURE);
  1428.      }
  1429.  
  1430.      MailStat.LowestNotDel=0;
  1431.      MailStat.LowestKey=1;
  1432.      MailStat.HighMsgNum=1;
  1433.      stat=Write(fd,(char *)&MailStat,sizeof(struct MailStat));
  1434.  } else
  1435.      stat=Read(fd,(char *)&MailStat,sizeof(struct MailStat));
  1436.  
  1437.  if(stat!=sizeof(struct MailStat)){
  1438.      Close(fd);  MyError(2);  return(FAILURE);
  1439.  }
  1440.  
  1441.  Close(fd);
  1442.  return(SUCCESS);
  1443. }
  1444.  
  1445. int AddFlagtoList(char *);
  1446. static int mcount;
  1447.  
  1448.  
  1449. static int JEZoom(void)
  1450. {
  1451.  FILE *fi,*fi1,*fo;
  1452.  struct MailHeader MH;
  1453.  int mystat;
  1454.  long Low, Num=0L, TimeVar;
  1455.  char FileName[100], ZoomName[80];
  1456.  char date[100], Temp[200], string[100];
  1457.  int cnt = 0;
  1458.  SetEnvStat(ENV_ZOOM);
  1459.  
  1460.  cnt = 0;
  1461.      // if nozoom set & user < co-sysop level skip conf
  1462.      AEPutStr("\r\n");
  1463.      sprintf(Temp,"\r\n   High Msg%ld",MailStat.HighMsgNum-1);
  1464.      AEPutStr(Temp);
  1465.      sprintf(Temp,"\r\n   Low  Msg%ld\r\n",MailStat.LowestNotDel);
  1466.      AEPutStr(Temp);
  1467.      sprintf(Temp,"  Last Read%ld\r\n",Last_Msg_Read_Conf);
  1468.      AEPutStr(Temp);
  1469.      AEPutStr("\r\n");
  1470.      AEPutStr("Zoom From >: ");
  1471.      sprintf(Temp,"%ld",Last_Msg_Read_Conf); Low=Last_Msg_Read_Conf;
  1472.      mystat=LineInput(Temp,Temp,10,KEYBOARD_TIMEOUT);
  1473.      
  1474.      if(mystat<0) return(mystat);
  1475.      AEPutStr("\r\n");
  1476.      if(atol(Temp)>=MailStat.LowestNotDel && atol(Temp)<=MailStat.HighMsgNum && Temp[0]!='\0') Low=atol(Temp);
  1477.      sprintf(Temp,"Zooming Mail from message %ld\r\n\r\n",Low);
  1478.      AEPutStr(Temp);
  1479.  
  1480.      sprintf(Temp,"%sHeaderFile",MsgBase_Location);
  1481.     
  1482.      fi=fopen(Temp,"rb");
  1483.      if(!fi) {
  1484.        AEPutStr("Message Base does not exist\r\n"); return(0);
  1485.      }
  1486.      sprintf(ZoomName,"%sZoom/C%dNd%dMail@%d",Cmds->BBSLoc,RelNum,Cmds->AcLvl[LVL_NODE_NUMBER],User.Slot_Number);
  1487.      fo=fopen(ZoomName,"a");
  1488.      if(!fo) { fclose(fi); return(0); }
  1489.      fseek(fi,(LONG)sizeof(struct MailHeader)*(LONG)(Low-MailStat.LowestKey),0);
  1490.      while(fread((APTR)&MH,sizeof(struct MailHeader),1,fi)!=NULL) {
  1491.          if(!CheckCarrier() && Whence_The_Logon==REMOTE_LOGON)
  1492.          {
  1493.             fclose(fo);
  1494.             fclose(fi);
  1495.             return(NO_CARRIER);
  1496.          }
  1497.          CheckDoorMsg(0);
  1498.          if(!strcmp(MH.ToName,User.Name) || !strcmp(MH.FromName,User.Name) || \
  1499.            MH.Status[0]=='P' || GET_BIT(ACS_SYSOP_READ))   {
  1500.              if((!MH.Recv || GET_BIT(ACS_SYSOP_READ)) \
  1501.                && MH.Status[0]!='D')  {
  1502.                  TimeVar=(long)MH.MsgDate;
  1503.                  sprintf(date,"%s",ctime(&TimeVar));
  1504.                  date[strlen(date)-1]='\0';
  1505.                  fprintf(fo,"\nDate   : %-30s  Number: %ld\n",date,MH.MsgNumb);
  1506.                  strcpy(date,MH.ToName);
  1507.                  strlwr(date);
  1508.                  TimeVar=(long)strncmp(date,"eall",4);
  1509.                  if(TimeVar==0) {
  1510.                      strcpy(date,User.Name);
  1511.                      strcat(date," (ALL)");
  1512.                  } else {
  1513.                      strcpy(date,MH.ToName);
  1514.                  }
  1515.                  fprintf(fo,"To     : %-30s  ",date);
  1516.  
  1517.                  if(MH.Recv!=0) {
  1518.                      TimeVar=MH.Recv;
  1519.                      sprintf(date,"%s",ctime(&TimeVar));
  1520.                      date[strlen(date)-1]='\0';
  1521.                      fprintf(fo,"Recv'd: %s\n",date);
  1522.                  } else {
  1523.                      fprintf(fo,"Recv'd: ");
  1524.                      if(StringCompare(MH.ToName,"ALL")==SUCCESS) {
  1525.                          fprintf(fo,"N/A\n");
  1526.                      } else {
  1527.                          fprintf(fo,"No\n");
  1528.                      }
  1529.                  }
  1530.  
  1531.                  if(MH.Status[0]=='P') {
  1532.                      strcpy(string,"Public Message");
  1533.                  } else {
  1534.                      strcpy(string,"Receiver Only");
  1535.                  }
  1536.  
  1537.                  fprintf(fo,"From   : %-30s  Status: %s\n",MH.FromName,string);
  1538.                  fprintf(fo,"Subject: %s\n",MH.Subject);
  1539.                  fprintf(fo,"Conf   : [%d] %s\n\n",RelNum,Conference_Name);
  1540.                  sprintf(FileName,"%s%d",MsgBase_Location,MH.MsgNumb);
  1541.                  if(fi1=fopen(FileName,"r")) {
  1542.                      while(fgets(FileName,80,fi1)!=NULL)
  1543.                          fprintf(fo,"%s",FileName);
  1544.  
  1545.                      fprintf(fo,"\n==========================================================================\n\n");
  1546.                      fclose(fi1);
  1547.                      AEPutStr("."); Num +=1L;
  1548.                  }
  1549.              }
  1550.          }
  1551.          Low +=1L;
  1552.      }                  /* while fread */
  1553.      fclose(fi);
  1554.      fclose(fo);
  1555.      
  1556.      Last_Msg_Read_Conf=Low;
  1557.  
  1558.  if(Num>0L) {
  1559.       SetComment(ZoomName,"F");
  1560.       AEPutStr("\r\n");
  1561.       if(Whence_The_Logon!=SYSOP_LOGON && Whence_The_Logon!=LOCAL_LOGON) {
  1562.          DTBT=0;
  1563.          TBT=0;
  1564.          TTTM=NULL;
  1565.          TTEFF=NULL;
  1566.          TTCPS=NULL;
  1567.          AEPutStr("Prepare for ZoomMail Zmodem Download:\r\n");
  1568.          mystat=DoPause();
  1569.          if(mystat<0) { DeleteFile(ZoomName);return(mystat); }
  1570.              SetEnvStat(ENV_DOWNLOADING);
  1571.              Zmodem_Send(ZoomName);
  1572.              DeleteFile(ZoomName);
  1573.          }
  1574.  
  1575.      }
  1576.      else
  1577.          AEPutStr("\r\nNo messages to Zoom\r\n");
  1578.     return(0);
  1579. }
  1580.  
  1581. int IsFromIcon(char *s,char *c)
  1582. {
  1583.    struct DiskObject *dobj;
  1584.    char temp[100];
  1585.    char **oldtooltypes;
  1586.    strcpy(temp,s);
  1587.    if(temp[strlen(temp)-1]=='/') temp[strlen(temp)-1]='\0';
  1588.    dobj=GetDiskObject(temp);
  1589.    if(dobj==NULL) return(0);
  1590.    oldtooltypes=dobj->do_ToolTypes;
  1591.    if(FindToolType(oldtooltypes,c)) { FreeDiskObject(dobj); return(1); }
  1592.    FreeDiskObject(dobj);
  1593.    return(0);
  1594. }
  1595.  
  1596. int GetFromIconStr(char *s,char *c,char *buf)
  1597. {
  1598.    struct DiskObject *dobj;
  1599.    char temp[100];
  1600.    char **oldtooltypes;
  1601.    char *t;
  1602.    strcpy(temp,s);
  1603.      if(temp[strlen(temp)-1]=='/') temp[strlen(temp)-1]='\0';
  1604.    dobj=GetDiskObject(temp);
  1605.    if(dobj==NULL) return(0);
  1606.    oldtooltypes=dobj->do_ToolTypes;
  1607.    if(t=FindToolType(oldtooltypes,c)) { strcpy(buf,t); FreeDiskObject(dobj); return(1); }
  1608.    FreeDiskObject(dobj);
  1609.    return(0);
  1610. }
  1611. int IntFromIcon(char *s,char *c)
  1612. {
  1613.    struct DiskObject *dobj;
  1614.    char temp[100];
  1615.    char **oldtooltypes;
  1616.    char *t;
  1617.    int num;
  1618.    strcpy(temp,s);
  1619.    if(temp[strlen(temp)-1]=='/') temp[strlen(temp)-1]='\0';
  1620.    dobj=GetDiskObject(temp);
  1621.    if(dobj==NULL) return(0);
  1622.    oldtooltypes=dobj->do_ToolTypes;
  1623.    if(t=FindToolType(oldtooltypes,c))
  1624.    { 
  1625.      strcpy(temp,t); num=atoi(t);FreeDiskObject(dobj); return(num); }
  1626.    FreeDiskObject(dobj);
  1627.    return(0);
  1628. }
  1629.  
  1630. int IsFromConf(int Conf,char *c);
  1631. int GetFromConf(int Conf,char *c,char *buf);
  1632. int IntFromConf(int Conf,char *c);
  1633.  
  1634. //#define CurConf(x)  dobj=(struct DiskObject *)*(MemConf+((ULONG)x))
  1635. #define CurConf(x) dobj=(struct DiskObject *)MemConf[x]
  1636. int IsFromConf(int Conf,char *c)
  1637. {
  1638.    struct DiskObject *dobj;
  1639.    char **oldtooltypes;
  1640.    CurConf(Conf);
  1641.    oldtooltypes=dobj->do_ToolTypes;
  1642.    if(FindToolType(oldtooltypes,c)) return(1); 
  1643.    return(0);
  1644. }
  1645.  
  1646. int GetFromConf(int Conf,char *c,char *buf)
  1647. {
  1648.    struct DiskObject *dobj;
  1649.    char **oldtooltypes;
  1650.    char *t;
  1651.    CurConf(Conf);
  1652.    oldtooltypes=dobj->do_ToolTypes;
  1653.    if(t=FindToolType(oldtooltypes,c)) { strcpy(buf,t); return(1); }
  1654.    return(0);
  1655. }
  1656. int IntFromConf(int Conf,char *c)
  1657. {
  1658.    struct DiskObject *dobj;
  1659.    char **oldtooltypes;
  1660.    char *t;
  1661.    int num;
  1662.    CurConf(Conf);
  1663.    oldtooltypes=dobj->do_ToolTypes;
  1664.    if(t=FindToolType(oldtooltypes,c))
  1665.    { 
  1666.      num=atoi(t);return(num); }
  1667.    return(0);
  1668. }
  1669.  
  1670.